package com.uade.tp.persistencia;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import com.uade.tp.negocio.Producto;
import com.uade.tp.negocio.view.ProductoView;


public class AdministrarPersistenciaProducto 
{
	private static AdministrarPersistenciaProducto pool;
	
	
	private AdministrarPersistenciaProducto()
	{
		
	}
	public static AdministrarPersistenciaProducto getInstancia()
	{
		if (pool== null)
			pool =new AdministrarPersistenciaProducto();
		return pool;
	}
	
	/**
	 * Previamente el proveedor tiene que existir. El cdgProducto es el nombre del producto
	 * @param p
	 */
	public void insert(Producto p)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "INSERT INTO  Producto (nombre, nombreProveedor,estado) VALUES (?,?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1,p.getNombre());			
			ps.setString(2,p.getProveedor());
			ps.setString(3, p.isEstado()?"S":"N");

			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Producto: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Producto: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      
	}
	public void update(Producto p)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "UPDATE Producto set nombreProveedor = ? where nombre = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1,p.getProveedor());
			ps.setString(2,p.getNombre());

			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Modificar Producto: " + e.getMessage());
				System.out.println("Stack Trace al Modificar Producto: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      
		
	}
	public void delete (Producto p)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "UPDATE Producto set estado = ? where nombre = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, p.isEstado()?"S":"N");
			ps.setString(2, p.getNombre());
			ps.execute();
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Borrar Producto: " + e.getMessage());
				System.out.println("Stack Trace al Borrar Producto: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      

	}
	public Producto buscarProducto(String nombre)
	{
		Producto p = null;
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "SELECT nombreProveedor,estado from Producto where nombre = ?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1,nombre);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				p = new Producto();
				p.setProveedor(result.getString("nombreProveedor"));
				p.setNombre(nombre);
				p.setEstado((result.getString("estado").equalsIgnoreCase("S"))?true:false);				
				
				
			}
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return p;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Borrar Producto: " + e.getMessage());
				System.out.println("Stack Trace al Borrar Producto: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return p;
	}
	
	public Vector<ProductoView> obtenerProductosView()
	{
		Vector<ProductoView> productos=new Vector<ProductoView>();
		
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "SELECT nombre,nombreProveedor,estado from Producto where estado='S'" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ResultSet result = ps.executeQuery();
			while (result.next())
			{
				Producto p = new Producto();
				p.setProveedor(result.getString("nombreProveedor"));
				p.setNombre(result.getString("nombre"));
				p.setEstado((result.getString("estado").equalsIgnoreCase("S"))?true:false);
				productos.add(p.getView());
				
			}
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return productos;
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Borrar Producto: " + e.getMessage());
				System.out.println("Stack Trace al Borrar Producto: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return productos;
	}
	
}
